package main

import "fmt"

// go语言的结构体是类型的集合

type Person struct {
	name    string
	age     int
	address string
	height  float32
}

// 给结构体绑定方法
// 接收器(p Person)有两种方式
// 方式1:值传递
// 注意，如果再函数里面去改变p的成员变量的值，是无效的。因为这里就像是值传递
func (p Person) printPerson() {
	fmt.Printf("name:%s,age:%d、n", p.name, p.age)
}

// 方式2：指针传递
func (p *Person) printPersonStar() {
	p.age = 23
	fmt.Printf("name:%s,age:%d、n", p.name, p.age)
}

func main() {
	//// 如何初始化结构体
	//p1 := Person{"lxy", 43, "北京", 1.68}
	//
	//// 更灵活，可以部分赋值
	//p2 := Person{
	//	name:    "lyc",
	//	age:     10,
	//	address: "北京",
	//	height:  1.43,
	//}
	//
	//var persons []Person
	//persons = append(persons, p1)
	//persons = append(persons, Person{
	//	name: "xx",
	//	age:  38,
	//})
	//
	//persons2 := []Person{
	//	{"lmy", 37, "北京", 1.68},
	//	{
	//		age: 12,
	//	},
	//}

	// 匿名结构体:只是临时用，没有名称的结构体
	// 第一个花括号是声明，第二个花括号是实例化
	address := struct {
		province      string
		city          string
		addressDetail string
	}{
		"北京",
		"丰台区",
		"方庄",
	}

	fmt.Println(address.city)

	p3 := Person{"lxy", 43, "北京", 1.69}

	p3.printPerson()
	fmt.Printf("1=====printPerson-name:%s,age:%d\n", p3.name, p3.age)
	p3.printPersonStar()
	fmt.Printf("1=====printPersonStar:name:%s,age:%d\n", p3.name, p3.age)

}
